/*
 * Copyright 2013 Glassy Cinema.
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */
package hu.glassy.core.util;

import org.springframework.data.domain.PageRequest;
import org.springframework.data.domain.Sort;
import org.springframework.data.domain.Sort.Direction;

/**
 * A JPA Repository-k lapozhatóságát segítő osztály. Elsősorban a service
 * osztályokban használt a lapozás feltételeinek feldolgozására, kód duplikáció
 * elkerülésének céljából.
 *
 * @author molnar.alexander@sonrisa.hu
 *
 */
public class PageableHelper
{

  /**
   * A megadott paraméterek alapján előállít egy {@link PageRequest} objektumot,
   * amit a JPA repository-knál lehet használni.
   *
   * @param start
   *                       Első elem indexe
   * @param size
   *                       Visszaadott elemek száma
   * @param asc
   *                       Ha true, növekvő sorrendben sorrendez, ha false, csökkenő sorrendben
   * @param sortProperties
   *                       Egy lista azokról a mezőkről, amelyek szerint rendezni kell
   *
   * @return {@link PageRequest} objektum
   */
  public static PageRequest generatePageRequest(final Long start, final Long size, final boolean asc, final String... sortProperties)
  {
    final Long pageNumber = start / size;
    final Direction direction = asc ? Direction.ASC : Direction.DESC;
    return new PageRequest(pageNumber.intValue(), size.intValue(), direction, sortProperties);
  }

  /**
   * Visszaad egy {@link Sort} objektumot a paraméterek alapján.
   *
   * @param asc
   *                       A rendezés sorrendjét határozza meg. Ha <strong>true</strong>, a rendezés
   *                       növekvő sorrendben történik, ha
   *                       <strong>false</strong>, a rendezés
   *                       csökkenő sorrendben történik
   * @param sortProperties
   *                       A rendezésben részt vevő mezők nevei.
   *
   * @return {@link Sort} objektum
   */
  public static Sort generateSort(final boolean asc, final String... sortProperties)
  {
    return new Sort(asc ? Direction.ASC : Direction.DESC, sortProperties);
  }
}
